package es.us.mwm.backBean;

import es.us.mwm.backBean.util.JsfUtil;
import es.us.mwm.entities.Users;
import es.us.mwm.sessionBean.UserEJBLocal;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

/**
 * CLASE GENERADA AUTOMATICAMENTE. MODIFICADA
 *
 * @author y0rg
 */
@Named(value = "usersController")
@ViewScoped
public class UsersController extends AbstractController<Users> implements Serializable {

    //Atributo que representa el recurso del servidor para el envio de correos. 
    //Debe estar creado en el server Glassfish con lo datos de la cuenta de correo desde la que se envian
    @Resource(name = "mailSession")
    private Session mailSession;
    //Para la barra de progreso de envio de mail tras dar de alta un usuario
    private int progress;

    @Inject
    private UserEJBLocal userFacade;
    
    /**
     * Constructor basico sin parametros
     */
    public UsersController() {
        super(Users.class);
    }

    /**
     * Metodo para el envio de los emails Se manda un email automaticamente al usuario que se ha dado de alta con sus datos
     * de acceso, se actualiza a cada paso el progreso de la barra
     */
    public void sendEmail() {
        try {
            progress = 0;
            Message msg = new MimeMessage(mailSession);
            msg.setSubject("Usuario servicio alertas 112");
            msg.setRecipient(RecipientType.TO, new InternetAddress(
                    this.getSelected().getEmail(), this.getSelected().getUser()));
            msg.setFrom(new InternetAddress("administracion@alertas.112", "Alertas112"));
            progress = 25;
            BodyPart messageBodyPart = new MimeBodyPart();
            messageBodyPart.setText("Le informamos que acaba de darse de alta su usuario en el servicio de alertas 112 con los siguientes datos:"
                    + "\n Usuario: " + this.getSelected().getUser()
                    + "\nContraseña: " + this.getSelected().getPassword()
                    + "\nLe recomendamos que acceda al sistema para comprobar el funcionamiento de su cuenta y que cambie la contraseña de acceso"
                    + "\nNota: Ha recibido este email automaticamente al genererse su cuenta, si cree no ser el distanatario del mismo, pongase en contacto con administracion@alertas.112. Gracias");
            progress = 50;
            Multipart multipart = new MimeMultipart();
            multipart.addBodyPart(messageBodyPart);

            msg.setContent(multipart);
            progress = 75;
            Transport.send(msg);
        } catch (MessagingException ex) {
            Logger.getLogger(UsersController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedEncodingException ex) {
            Logger.getLogger(UsersController.class.getName()).log(Level.SEVERE, null, ex);
        }
        progress = 100;
    }

    /**
     * Metodo que se ejecuta cuando se completa la accion
     */
    public void onComplete() {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Progress Completed", "Progress Completed"));
    }

    @Override
    public void saveNew(ActionEvent event) {
        if (userFacade.getUser(super.getSelected().getUser())==null) {
            this.sendEmail();
            super.saveNew(event);
        } else {
            JsfUtil.addErrorMessage("Error, el usuario ya existe en el sistema");
        }
    }

    /**
     *
     * @return
     */
    public int getProgress() {
        return progress;
    }

    /**
     *
     * @param progress
     */
    public void setProgress(int progress) {
        this.progress = progress;
    }

}
